﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using reactiveBT.Utilities;

namespace reactiveBT.BT
{
    /// <summary>
    /// 2022.3.27
    /// 设计目的：给外接一个调用行为树的接口，内部封装完整的行为树和黑板（？）行为树黑板应该是独立的还是集成的
    /// 黑板全局唯一，做成键值对的数据库模式，提供单向绑定机制
    /// 2022.4.05
    /// 引出一个问题，如何让内部节点与黑板通信的时候知道自己的树id与节点id(不必要)
    /// 与树通信的需求会接受一个fn或者一个协程作为通信方式，节点需要知道树id可以有三种方式——内部保存值和内部保存引用和update传参
    /// 需要考虑序列化才能解决这个问题
    /// 2022.4.09
    /// 序列化确定为自定义的xml序列化，排除序列化内置函数的二进制序列化
    /// 连带的，黑板就可以确定下来
    /// 这里先做个简单的接口用于测试行为树节点。
    /// 2022.4.28
    /// 然而变成了json序列化，那么黑板变成了一个纯runtime的概念了吗？
    /// </summary>
    public class BTHandle
    {
        public static int idAccumulator = 0;
        private BTNode BTRoot;
        private int BTid;
        private int updateCount;
        private bool isStop;
        public BTHandle(BTNode node)
        {
            BTRoot = node;
            BTid = idAccumulator++;
            updateCount = 0;
            isStop = false;
        }
        /// <summary>
        /// 姑且先把这里的返回值置空，通过log的方式
        /// </summary>
        public void update()
        {
            if (BTRoot == null || isStop)
                return;
            var result = BTRoot.Tick(BTid);
            switch (result)
            {
                case BTState.Success:
                    Console.WriteLine($"id:{BTid} updateCount:{updateCount}  Success");
                    break;
                case BTState.Failure:
                    Console.WriteLine($"id:{BTid} updateCount:{updateCount}  Failure");
                    isStop = true;
                    break ;
                case BTState.Continue:
                    Console.WriteLine($"id:{BTid} updateCount:{updateCount}  Continue");
                    break;
                case BTState.Abort:
                    Console.WriteLine($"id:{BTid} updateCount:{updateCount}  Abort");
                    break;
                default:
                    Console.WriteLine($"id:{BTid} updateCount:{updateCount}  Error");
                    break ;
            }
            updateCount++;
        }
    }
}
